
package com.x52im.rbchat.logic.search.viewholder;

import android.text.SpannableStringBuilder;
import android.view.View;

import com.bumptech.glide.Glide;
import com.eva.android.widget.WidgetUtils;
import com.eva.epc.common.util.CommonUtils;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.ImageCacheLoader;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.logic.search.content.FriendsContent;

import androidx.fragment.app.Fragment;

/**
 * 好友item的viewHolder对象实现类。
 *
 * @author JackJiang
 * @since 8.2
 */
public class FriendViewHolder extends AbstractViewHolder<RosterElementEntity> {

    public FriendViewHolder(Fragment fragment, View itemView) {
        super(fragment, itemView);
    }

    /**
     * 用于RecycleView的adapter中的onBindViewHolder方法。
     *
     * @param keyword    本次搜索的关键字（用于ui显示时的高亮显示）
     * @param userInfo   列表item对应的数据对象引用
     * @param showCatlog 是否显示item上方的标题文本（true表示显示，否则不显示）
     */
    @Override
    public void onBind(String keyword, RosterElementEntity userInfo, boolean showCatlog) {

        // 设置catlog的可见性
        itemView.findViewById(R.id.search_result_item_categoryLL).setVisibility(showCatlog?View.VISIBLE:View.GONE);
        tvCatlog.setText(showCatlog? FriendsContent.CATLOG:null);
        // 默认设置更多内容组件不可见
        tvMoreDesc.setVisibility(View.GONE);


        /*----------- 以下逻辑用于实现，当存在好友备注的情况下，如果是原昵称匹配了关键字，则要同时显示原昵称，否则不显示 START -----------*/

        String nickname = userInfo.getNickname();
        String friendRemark = userInfo.getFriendRemark();

        // 是否存在好友备注
        boolean hasFriendRemark = (!CommonUtils.isStringEmpty(friendRemark, true));
        // 好友备注是否包含关键字
        boolean friendRemarkMatched = false;
        if(hasFriendRemark && keyword != null){
            friendRemarkMatched = friendRemark.toLowerCase().contains(keyword.toLowerCase());
        }

        // 如果设置了该好友的备注
        if(hasFriendRemark){
            // 如果好友备注包含关键字，则显示好友备注，并设置关键词高亮显示
            if(friendRemarkMatched){
                SpannableStringBuilder ssb = WidgetUtils.coloredStringForSearch(this.fragment.getContext(), friendRemark, keyword, R.color.common_list_light_red_for_text);
                tvName.setText(ssb != null? ssb : friendRemark);
            } else{// 如果好友备注不包含关键字，则设置原昵称的显示，并对原昵称进行关键高亮显示
                // titile上显示好友备注
                tvName.setText(friendRemark);
                // 更多描述组件上显示原昵称，并高亮显示关键字
                tvMoreDesc.setVisibility(View.VISIBLE);
                SpannableStringBuilder ssb = WidgetUtils.coloredStringForSearch(this.fragment.getContext(), nickname, keyword, R.color.common_list_light_red_for_text);
                tvMoreDesc.setText(ssb != null?(new SpannableStringBuilder("昵称: ").append(ssb)): nickname);
            }
        } else{// 如果没设置好友备注，那关键关匹配的肯定就是原昵称了
            // 原昵称高亮显示关键字
            SpannableStringBuilder ssb = WidgetUtils.coloredStringForSearch(this.fragment.getContext(), nickname, keyword, R.color.common_list_light_red_for_text);
            tvName.setText(ssb != null? ssb : nickname);
        }
        /*----------- 以下逻辑用于实现，当存在好友备注的情况下，如果是原昵称匹配了关键字，则要同时显示原昵称，否则不显示 END -----------*/


        // 根据Glide官方指南的说明，以下clear是为了防止图片显示错乱
        Glide.with(fragment).clear(ivAvatar);// 解决方法2
        // clear完成后设置默认占位图，确保图片显示不出现Glide导致的错位问题
        ivAvatar.setImageResource(R.drawable.default_avatar_for_contact_40dp_21pxround);
        // 头像文件名
        String userAvatarFileName = userInfo.getUserAvatarFileName();
        // 头像文件名为空就表示此人是没有被设置头像的
        if(!CommonUtils.isStringEmpty(userAvatarFileName, true)) {
            // 加载头像图片
            ImageCacheLoader.loadAvatarImgWithGlide(fragment, userInfo.getUser_uid(), userAvatarFileName
                    , ivAvatar
                    , 7 // 圆角单位是dp，（相当于xxhdpi下的21像素）
                    , R.drawable.default_avatar_for_contact_40dp_21pxround, false, false);
        }
    }
}
